iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
1
自我挑戰組

從色彩繽紛到只看亂碼日子,學程式從 Ruby 出發!系列 第 14

Day14 | 實體變數(instance Variable)

  • 分享至 

  • xImage
  •  

@實體變數

記得之前講到變數與常數,其中有一個@開頭的,我們稱它為實體變數。在類別中,它是一個可以讓所有的方法共用得變數,而且與每個實體之間並不會互相影響。
實體變數很常見,我們隨機開啟一個專案裡,就會看到@candidates

class CandidatesController < ApplicationController

  def index
    @candidates = Candidate.order(vote: :desc)
  end

… (略)

又或者在view裡

<%= @candidates.name %>

以上@candidates這樣的寫法就是一個實體變數。

使用條件

在類別裡面,必須先把new方法所傳進來的參數先進行初始化(initialize)之後才能使用,因為在initialize這方法裡,會將參數傳進來給內部的實體變數。

使用方法

首先要先知道,實體變數沒辦法直接從外部直接取用,從以下例子來看

class Girl
  def initialize(name, age)
    @name = name
    @age = age
  end

  def say_hi
    puts "你好,我是 #{@name},今年 #{@age} 歲"
  end
end

girl = Girl.new("Sophia", 3)
girl.say_hi			# => 你好,我是 Sophia,今年 3 歲
puts girl.name		# => NoMethodError

像這樣直接取用會發生NoMethodError的錯誤訊息。
如果還是想要取用實體變數,那我們必須另外定義的方法才行。

class Girl

… (略)

  def name
    "我是#{@name}"
  end
end

girl = Girl.new("Sophia", 3)
puts girl.name		# => 我是Sophia

其實還可以使用Ruby內建的方法,attr_reader,attr_writer以及attr_accessor,那這邊我們就先使用 以換成另一種方法,attr_accessor這個可讀可寫的方法,就可以正常使用了

class Girl
  attr_accessor :name,:age
  def initialize(name, age)
    @name = name
    @age = age
  end

  def say_hi
    puts "你好,我是 #{@name},今年 #{@age} 歲"
  end
end

girl = Girl.new("Sophia", 3)
puts girl.name		# => Sophia
puts girl.age		# => 3

然後這邊小提醒,不要把「@」手誤打成「@@」類別變數(class Variable),因為類別變數除了在自己的class使用之外,為因為繼承關係,所以也可以直接在其他得class使用,為了避免日後專案出錯,建議小心服用(但聽建議是說不要亂嘗試啦~

class Animal
  @@cat = :a
  @dog = :b

  def self.cat
    @@cat
  end

  def self.dog
    @dog
  end
end

class Zoo < Animal
end

p Animal.dog # :b
p Zoo.dog # nil
p Animal.cat # :a 
p Zoo.cat # :a

關於類別變數,菜鳥接觸程式不久,還沒用過也沒遇過~
等我哪天真的手誤了再來發敲一篇心得好了。


參考連結:
為你自己學 Ruby on Rails


上一篇
Day13 | 你好,我是 Hash 雜湊 哈希
下一篇
Day15 | attr_reader . attr_writer . attr_accessor
系列文
從色彩繽紛到只看亂碼日子,學程式從 Ruby 出發!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言